import axios from 'axios';
import { ElMessage } from 'element-plus';
import router from '@/router';

// 创建 axios 实例
const request = axios.create({
  baseURL: 'http://localhost:3002',
  timeout: 30000, // 增加超时时间，因为视频生成可能需要较长时间
  headers: {
    'Content-Type': 'application/json'
  }
});

// 日志函数
const logError = (message, error) => {
  console.error(`[API ERROR] ${message}:`, error);
  // 在开发环境中，可以添加更详细的日志
  if (process.env.NODE_ENV === 'development') {
    console.error('详细错误信息:', {
      config: error.config,
      response: error.response,
      message: error.message
    });
  }
};

// 请求拦截器
request.interceptors.request.use(
  config => {
    // 从 localStorage 获取 API-Key
    const apiKey = localStorage.getItem('docmee_token');
    
    // 如果存在API-Key，添加到请求头
    if (apiKey) {
      // 添加token请求头
      if (!config.headers['token']) {
        config.headers['token'] = apiKey;
        console.log('请求添加认证头 token:', apiKey ? '******' : undefined);
      }
      
      // 同时添加Api-Key请求头
      if (!config.headers['Api-Key']) {
        config.headers['Api-Key'] = apiKey;
        console.log('请求添加认证头 Api-Key:', apiKey ? '******' : undefined);
      }
    }
    
    // 确保Content-Type正确
    if (!config.headers['Content-Type'] && (config.method === 'post' || config.method === 'put')) {
      config.headers['Content-Type'] = 'application/json';
    }
    
    // 打印请求信息
    console.log(`[API REQUEST] ${config.method?.toUpperCase()} ${config.url}`, {
      headers: {
        ...config.headers,
        // 隐藏敏感信息
        'token': config.headers['token'] ? '******' : undefined,
        'Api-Key': config.headers['Api-Key'] ? '******' : undefined
      },
      data: config.data,
      params: config.params
    });
    
    return config;
  },
  error => {
    logError('请求错误', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
request.interceptors.response.use(
  response => {
    // 打印响应信息
    console.log(`[API RESPONSE] ${response.config.method?.toUpperCase()} ${response.config.url}`, {
      status: response.status,
      data: response.data
    });
    
    // 检查响应数据
    if (!response.data) {
      logError('响应数据为空', { response });
      return Promise.reject(new Error('响应数据为空'));
    }
    
    // 检查业务状态码
    if (response.data.code !== undefined && response.data.code !== 0) {
      logError('业务错误', { response });
      const errorMsg = response.data.message || '操作失败';
      ElMessage.error(errorMsg);
      
      // 如果是 token 相关错误
      if (errorMsg.includes('token') || errorMsg.includes('认证')) {
        localStorage.removeItem('docmee_token');
        // 需要重新获取 token 的情况
        return Promise.reject({
          response: {
            status: 401,
            data: response.data
          },
          message: errorMsg
        });
      }
      
      return Promise.reject({
        response: {
          status: response.status,
          data: response.data
        },
        message: errorMsg
      });
    }
    
    return response;
  },
  error => {
    logError('响应错误', error);
    
    if (error.response) {
      const { status, data } = error.response;
      
      // 根据状态码处理不同错误
      switch (status) {
        case 401:
          // Token 无效，清除本地存储
          localStorage.removeItem('docmee_token');
          ElMessage.error('登录已过期，请重新登录');
          router.push('/login');
          break;
          
        case 403:
          ElMessage.error('没有权限访问此资源');
          break;
          
        case 404:
          ElMessage.error('请求的资源不存在');
          break;
          
        case 500:
          ElMessage.error('服务器错误，请稍后重试');
          break;
          
        default:
          ElMessage.error(data?.message || error.message || '请求失败');
          break;
      }
    } else if (error.request) {
      // 请求已发送但没有收到响应
      ElMessage.error('服务器无响应，请检查网络连接');
    } else {
      // 请求设置有问题
      ElMessage.error('请求配置错误: ' + error.message);
    }
    
    return Promise.reject(error);
  }
);

// 导出自定义错误类型
export class ApiError extends Error {
  constructor(message, response) {
    super(message);
    this.name = 'ApiError';
    this.response = response;
  }
}

export default request; 